module jinji.user.model;

import jinji.common.model;
import jinji.user.token;
import jinji.util.crypto;

enum {
	/// 最大用户名长度
	maxUNameLength = 32,
	/// 最大邮箱长度
	maxEmailLength = 255
}

/// 用户
@snakeCase
struct User {
@notnull:
	/// 用户ID
	@serial Id id;
	/// 用户名
	@sqltype(text("varchar(", maxUNameLength, ')')) @unique string name;
	/// 邮箱
	@sqltype(text("varchar(", maxEmailLength, ')')) @unique string email;
	/// 密码
	@check!"length(pwd)=33"ubyte[] pwd;
	/// 用户状态（0正常，1禁用）
	@default0 uint status;
	/// 权限
	Perm perm;
	/// 最后登录时间
	@defaultCT StdTime last_login;
	/// 累计登录次数
	@default0 uint log_times;
	/// 注册时间
	StdTime created_at;
}

/// 废除的令牌
@snakeCase
struct RevokedToken {
@notnull:
	/// 令牌
	@PK @check!(text("length(token)=", Payload.sizeof)) const(ubyte)[] token;
	/// UID
	@FK!(User.id) Id uid;
	/// 权限
	@default0 Perm perm;
	/// 描述
	@defEmpty Desc desc;
	/// 过期时间
	StdTime expires_at;
}
